From aa82c3b80739646e75e50920b4a05c2ef55b49f6 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Mon, 22 Aug 2005 09:52:06 +0000 Subject: [PATCH] Ensure that 64-bit get_user/put_user only transfer to a 64-bit local variable. Some gcc versions have bugs if this restriction isn't observed. Signed-off-by: Keir Fraser --- xen/include/asm-x86/x86_32/uaccess.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/xen/include/asm-x86/x86_32/uaccess.h b/xen/include/asm-x86/x86_32/uaccess.h index 176c8401fe..1ea7f86cae 100644 --- a/xen/include/asm-x86/x86_32/uaccess.h +++ b/xen/include/asm-x86/x86_32/uaccess.h @@ -22,7 +22,11 @@ #define array_access_ok(addr,count,size) \ (likely(count < (~0UL/size)) && access_ok(addr,count*size)) +/* Undefined function to catch size mismatches on 64-bit get_user/put_user. */ +extern void __uaccess_var_not_u64(void); + #define __put_user_u64(x, addr, retval, errret) \ + if (sizeof(x) != 8) __uaccess_var_not_u64(); \ __asm__ __volatile__( \ "1: movl %%eax,0(%2)\n" \ "2: movl %%edx,4(%2)\n" \ @@ -52,6 +56,7 @@ do { \ } while (0) #define __get_user_u64(x, addr, retval, errret) \ + if (sizeof(x) != 8) __uaccess_var_not_u64(); \ __asm__ __volatile__( \ "1: movl 0(%2),%%eax\n" \ "2: movl 4(%2),%%edx\n" \ -- 2.30.2